// Name:                Mixins
//
// Description:         Less mixins for Amaze UI
//
// - Box-Model
// - Typographic
// - Visual
// - CSS3 Vendor Prefixes - NOT RECOMMENDED, USE AutoPrefixer
// - Flex Box
// - Utilities
// - COMPONENTS
//
// =============================================================================
// =============================================================================
// Box Model
// =============================================================================
// Micro clear fix
// via: http://nicolasgallagher.com/micro-clearfix-hack/
.clearfix() {
    &:before, &:after {
        content: " ";
        display: table;
    }
    &:after {
        clear: both;
    }
}

// Center-align a block level element
.center-block() {
    display: block;
    margin-left: auto;
    margin-right: auto;
}

// Sizing shortcuts
// -----------------------------------------------------------------------------
.size(@width;
@height) {
    width: @width;
    height: @height;
}

.square(@size) {
    .size(@size;
    @size);
}

// Resize anything
// -----------------------------------------------------------------------------
.resizable(@direction) {
    resize: @direction; // Options: horizontal, vertical, both
    overflow: auto; // Safari fix
}

// Scrollable
// -----------------------------------------------------------------------------
// TODO: add scrollableX & scrollableY
.scrollable() {
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}

// =============================================================================
// Typographic
// =============================================================================
// Text overflow
// Requires inline-block or block for proper styling
// -----------------------------------------------------------------------------
.text-overflow(@display: block) {
    display: @display;
    word-wrap: normal;
    /* for IE */
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}

// CSS image replacement
// via: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
// -----------------------------------------------------------------------------
.text-hide() {
    font: ~"0/0" a;
    color: transparent;
    text-shadow: none;
    background-color: transparent;
    border: 0;
}

// Line clamp
// http://dropshado.ws/post/1015351370/webkit-line-clamp
// -----------------------------------------------------------------------------
.am-line-clamp(@lines, @line-height: 1.3em) {
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: @lines; // number of lines to show
    overflow: hidden;
    line-height: @line-height;
    max-height: @line-height * @lines;
}

// =============================================================================
// Visual
// =============================================================================
// WebKit-style focus
.tab-focus() {
    // Default
    // outline: thin dotted;
    // fix by me
    // WebKit
    // outline: 1px auto -webkit-focus-ring-color;
    // outline-offset: -2px;
}

// Single side border-radius
// -----------------------------------------------------------------------------
.border-top-radius(@radius) {
    border-top-right-radius: @radius;
    border-top-left-radius: @radius;
}

.border-right-radius(@radius) {
    border-bottom-right-radius: @radius;
    border-top-right-radius: @radius;
}

.border-bottom-radius(@radius) {
    border-bottom-right-radius: @radius;
    border-bottom-left-radius: @radius;
}

.border-left-radius(@radius) {
    border-bottom-left-radius: @radius;
    border-top-left-radius: @radius;
}

// Opacity
// -----------------------------------------------------------------------------
.opacity(@opacity) {
    opacity: @opacity;
}

// GRADIENTS
// -----------------------------------------------------------------------------
// Horizontal gradient, from left to right
// Creates two color stops, start and end, by specifying a color and position for each color stop.
// Color stops are not available in IE9 and below.
.gradient-horizontal(@start-color: #555;
@end-color: #333;
@start-percent: 0%;
@end-percent: 100%) {
    background-image: -webkit-gradient(linear, @start-percent top, @end-percent top, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1+, Chrome 10+
    background-image: -moz-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // FF 3.6+
    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10
    background-repeat: repeat-x;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)", argb(@start-color), argb(@end-color))); // IE9 and down
}

// Vertical gradient, from top to bottom
// Creates two color stops, start and end, by specifying a color and position for each color stop.
// Color stops are not available in IE9 and below.
.gradient-vertical(@start-color: #555;
@end-color: #333;
@start-percent: 0%;
@end-percent: 100%) {
    background-image: -webkit-gradient(linear, left @start-percent, left @end-percent, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1+, Chrome 10+
    background-image: -moz-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // FF 3.6+
    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10
    background-repeat: repeat-x;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)", argb(@start-color), argb(@end-color))); // IE9 and down
}

.gradient-directional(@start-color: #555;
@end-color: #333;
@deg: 45deg) {
    background-repeat: repeat-x;
    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1+, Chrome 10+
    background-image: -moz-linear-gradient(@deg, @start-color, @end-color); // FF 3.6+
    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10
}

.gradient-horizontal-3c(@start-color: #00b3ee;
@mid-color: #7a43b6;
@color-stop: 50%;
@end-color: #c3325f) {
    background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));
    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
    background-image: -moz-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
    background-repeat: no-repeat;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
}

.gradient-vertical-3c(@start-color: #00b3ee;
@mid-color: #7a43b6;
@color-stop: 50%;
@end-color: #c3325f) {
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));
    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    background-image: -moz-linear-gradient(top, @start-color, @mid-color @color-stop, @end-color);
    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    background-repeat: no-repeat;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
}

//放射状
.gradient-radial(@inner-color: #555;
@outer-color: #333) {
    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@inner-color), to(@outer-color));
    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
    background-image: -moz-radial-gradient(circle, @inner-color, @outer-color);
    background-image: radial-gradient(circle, @inner-color, @outer-color);
    background-repeat: no-repeat;
}

.gradient-striped(@color: rgba(255, 255, 255, .15);
@angle: 45deg) {
    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, @color), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, @color), color-stop(.75, @color), color-stop(.75, transparent), to(transparent));
    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
    background-image: -moz-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
}

// Legacy aliases
#gradient {
    .horizontal(@start-color: #555;
    @end-color: #333;
    @start-percent: 0%;
    @end-percent: 100%) {
        .gradient-horizontal(@start-color;
        @end-color;
        @start-percent;
        @end-percent);
    }
    .vertical(@start-color: #555;
    @end-color: #333;
    @start-percent: 0%;
    @end-percent: 100%) {
        .gradient-vertical(@start-color;
        @end-color;
        @start-percent;
        @end-percent);
    }
    .directional(@start-color: #555;
    @end-color: #333;
    @deg: 45deg) {
        .gradient-directional(@start-color;
        @end-color;
        @deg);
    }
    .horizontal-3c(@start-color: #00b3ee;
    @mid-color: #7a43b6;
    @color-stop: 50%;
    @end-color: #c3325f) {
        .gradient-horizontal-3c(@start-color;
        @mid-color;
        @color-stop;
        @end-color);
    }
    .vertical-3c(@start-color: #00b3ee;
    @mid-color: #7a43b6;
    @color-stop: 50%;
    @end-color: #c3325f) {
        .gradient-vertical-3c(@start-color;
        @mid-color;
        @color-stop;
        @end-color);
    }
    //放射状
    .radial(@inner-color: #555;
    @outer-color: #333) {
        .gradient-radial(@inner-color;
        @outer-color);
    }
    .striped(@color: rgba(255, 255, 255, .15);
    @angle: 45deg) {
        .gradient-striped(@color;
        @angle);
    }
}

// Reset filters for IE
//
// When you need to remove a gradient background, do not forget to use this to
// reset the IE filter for IE9 and below.
// -----------------------------------------------------------------------------
.reset-filter() {
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
}

// Retina images
// Short retina mixin for setting background-image and -size
// -----------------------------------------------------------------------------
.retina-bg-img(@file-1x;
@file-2x;
@width-1x;
@height-1x) {
    background-image: url("@{file-1x}");
    @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) {
        background-image: url("@{file-2x}");
        background-size: @width-1x @height-1x;
    }
}

// Responsive image
// Keep images from scaling beyond the width of their parents.
// -----------------------------------------------------------------------------
.img-responsive(@display: block) {
    display: @display;
    max-width: 100%; // Part 1: Set a maximum relative to the parent
    height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
}

// =============================================================================
// CSS3 Vendor Prefixes
// =============================================================================
// Try to use Autoprefixer replace these mixins
// - Animations
// - Backface visibility
// - Box shadow
// - Box sizing
// - Content columns
// - Hyphens
// - Placeholder text
// - Transformations
// - Transitions
// - User Select
// Animations
// -----------------------------------------------------------------------------
.animation(@animation) {
    -webkit-animation: @animation;
    animation: @animation;
}

.animation-name(@name) {
    -webkit-animation-name: @name;
    animation-name: @name;
}

.animation-duration(@duration) {
    -webkit-animation-duration: @duration;
    animation-duration: @duration;
}

.animation-timing-function(@timing-function) {
    -webkit-animation-timing-function: @timing-function;
    animation-timing-function: @timing-function;
}

.animation-delay(@delay) {
    -webkit-animation-delay: @delay;
    animation-delay: @delay;
}

.animation-iteration-count(@iteration-count) {
    -webkit-animation-iteration-count: @iteration-count;
    animation-iteration-count: @iteration-count;
}

.animation-direction(@direction) {
    -webkit-animation-direction: @direction;
    animation-direction: @direction;
}

.animation-fill-mode(@fill-mode) {
    -webkit-animation-fill-mode: @fill-mode;
    animation-fill-mode: @fill-mode;
}

// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden`
// -----------------------------------------------------------------------------
.backface-visibility(@visibility) {
    -webkit-backface-visibility: @visibility;
    -moz-backface-visibility: @visibility;
    backface-visibility: @visibility;
}

// Box shadows
// -----------------------------------------------------------------------------
.box-shadow(@shadow) {
    -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1 & bb7.0
    box-shadow: @shadow;
}

// Box sizing
// -----------------------------------------------------------------------------
.box-sizing(@boxmodel) {
    -webkit-box-sizing: @boxmodel;
    -moz-box-sizing: @boxmodel;
    box-sizing: @boxmodel;
}

// Content Columns
// -----------------------------------------------------------------------------
.content-columns(@column-count;
@column-gap: @grid-gutter-width) {
    -webkit-column-count: @column-count;
    -moz-column-count: @column-count;
    column-count: @column-count;
    -webkit-column-gap: @column-gap;
    -moz-column-gap: @column-gap;
    column-gap: @column-gap;
}

// Optional hyphenation
// -----------------------------------------------------------------------------
.hyphens(@mode: auto) {
    word-wrap: break-word;
    -webkit-hyphens: @mode;
    -moz-hyphens: @mode;
    -ms-hyphens: @mode; // IE10+
    -o-hyphens: @mode;
    hyphens: @mode;
}

// Placeholder text
// -----------------------------------------------------------------------------
.placeholder(@color: @input-color-placeholder) {
    // Firefox
    &::-moz-placeholder {
        color: @color;
        opacity: 1;
    }
    // Internet Explorer 10+
    &:-ms-input-placeholder {
        color: @color;
    }
    // Safari and Chrome
    &::-webkit-input-placeholder {
        color: @color;
    }
}

// Transformations
// -----------------------------------------------------------------------------
.scale(@ratio) {
    -webkit-transform: scale(@ratio);
    -ms-transform: scale(@ratio); // IE9 only
    -o-transform: scale(@ratio);
    transform: scale(@ratio);
}

.scale(@ratioX;
@ratioY) {
    -webkit-transform: scale(@ratioX, @ratioY);
    -ms-transform: scale(@ratioX, @ratioY); // IE9 only
    -o-transform: scale(@ratioX, @ratioY);
    transform: scale(@ratioX, @ratioY);
}

.scaleX(@ratio) {
    -webkit-transform: scaleX(@ratio);
    -ms-transform: scaleX(@ratio); // IE9 only
    -o-transform: scaleX(@ratio);
    transform: scaleX(@ratio);
}

.scaleY(@ratio) {
    -webkit-transform: scaleY(@ratio);
    -ms-transform: scaleY(@ratio); // IE9 only
    -o-transform: scaleY(@ratio);
    transform: scaleY(@ratio);
}

.skew(@x;
@y) {
    -webkit-transform: skew(@x, @y);
    -ms-transform: skewX(@x) skewY(@y); // IE9+
    transform: skew(@x, @y);
}

.translate(@x: 0;
@y: 0) {
    -webkit-transform: translate(@x, @y);
    -ms-transform: translate(@x, @y); // IE9+
    transform: translate(@x, @y);
}

.translateX(@x: 0) {
    -webkit-transform: translateX(@x);
    -ms-transform: translateX(@x); // IE9+
    transform: translateX(@x);
}

.translateY(@y: 0) {
    -webkit-transform: translateY(@y);
    -ms-transform: translateY(@y); // IE9+
    transform: translateY(@y);
}

.translate3d(@x: 0;
@y: 0;
@z: 0) {
    -webkit-transform: translate3d(@x, @y, @z);
    -ms-transform: translate3d(@x, @y, @z);
    transform: translate3d(@x, @y, @z);
}

.rotate(@degrees) {
    -webkit-transform: rotate(@degrees);
    -ms-transform: rotate(@degrees); // IE9+
    transform: rotate(@degrees);
}

.rotateX(@degrees) {
    -webkit-transform: rotateX(@degrees);
    -ms-transform: rotateX(@degrees); // IE9+
    transform: rotateX(@degrees);
}

.rotateY(@degrees) {
    -webkit-transform: rotateY(@degrees);
    -ms-transform: rotateY(@degrees); // IE9+
    transform: rotateY(@degrees);
}

.perspective(@perspective) {
    -webkit-perspective: @perspective;
    -moz-perspective: @perspective;
    perspective: @perspective;
}

.perspective-origin(@perspective) {
    -webkit-perspective-origin: @perspective;
    -moz-perspective-origin: @perspective;
    perspective-origin: @perspective;
}

.transform-origin(@origin) {
    -webkit-transform-origin: @origin;
    -ms-transform-origin: @origin;
    transform-origin: @origin;
}

.transform(@tramsform) {
    -webkit-transform: @tramsform;
    -ms-transform: @tramsform;
    transform: @tramsform;
}

// Transitions
// -----------------------------------------------------------------------------
.transition(@transition) {
    -webkit-transition: @transition;
    transition: @transition;
}

.transition-property(@transition-property) {
    -webkit-transition-property: @transition-property;
    transition-property: @transition-property;
}

.transition-delay(@transition-delay) {
    -webkit-transition-delay: @transition-delay;
    transition-delay: @transition-delay;
}

.transition-duration(@transition-duration) {
    -webkit-transition-duration: @transition-duration;
    transition-duration: @transition-duration;
}

.transition-timing-function(@timing-function) {
    -webkit-transition-timing-function: @timing-function;
    transition-timing-function: @timing-function;
}

.transition-transform(@transition) {
    -webkit-transition: -webkit-transform @transition;
    -moz-transition: -moz-transform @transition;
    -o-transition: -o-transform @transition;
    transition: transform @transition;
}

// User select
// For selecting text on the page
// Formal syntax: none | text | all | element
// -----------------------------------------------------------------------------
.user-select(@select) {
    -webkit-user-select: @select;
    -moz-user-select: @select;
    -ms-user-select: @select; // IE10+
    user-select: @select;
}

// =============================================================================
// Flexbox
// =============================================================================
// The spec: http://www.w3.org/TR/css3-flexbox
// via: https://gist.github.com/jayj/4012969
//      https://github.com/mastastealth/sass-flex-mixin/blob/master/flex.scss
//      http://codepen.io/adamjohnson/pen/savzI
//      http://css-tricks.com/old-flexbox-and-new-flexbox/
//      http://html5please.com/#flexbox
//
// NOTE: NEED CODE REVIEW
// -----------------------------------------------------------------------------
// Flexbox display
// flex | inline-flex
.flexbox(@display: flex) {
    display: -webkit-box; // Old syntax
    display:~"-webkit-@{display}";
    display:~"-moz-@{display}";
    display:~"-ms-@{display}box"; // IE10 uses -ms-flexbox
    display:~"-ms-@{display}"; // IE11
    display: @display;
}

// The 'flex' shorthand
// This shorthand for `flex-grow`, `flex-shrink` and `flex-basis` combined.
// The second and third parameters (flex-shrink and flex-basis) are optional.
// Default is 0 1 auto.
// - applies to: flex items
// <positive-number>, initial, auto, or none
.flex(@columns: 1) {
    -webkit-box-flex: @columns; // Old syntax
    -webkit-flex: @columns;
    -moz-flex: @columns;
    -ms-flex: @columns;
    flex: @columns;
}

// Flex Flow Direction
// - applies to: flex containers
// row | row-reverse | column | column-reverse
.flex-direction(@direction: row) {
    -webkit-flex-direction: @direction;
    -moz-flex-direction: @direction;
    -ms-flex-direction: @direction;
    flex-direction: @direction;
}

// Flex Line Wrapping
// - applies to: flex containers
// nowrap | wrap | wrap-reverse
.flex-wrap(@wrap: nowrap) {
    -webkit-flex-wrap: @wrap;
    -moz-flex-wrap: @wrap;
    -ms-flex-wrap: @wrap;
    flex-wrap: @wrap;
}

// Flex Direction and Wrap
// The shorthand for `flex-direction` and `flex-wrap`
// - applies to: flex containers
// <flex-direction> || <flex-wrap>
.flex-flow(@flow: ~"row nowrap") {
    -webkit-flex-flow: @flow;
    -moz-flex-flow: @flow;
    -ms-flex-flow: @flow;
    flex-flow: @flow;
}

// Axis Alignment
// - applies to: flex containers
// flex-start | flex-end | center | space-between | space-around
.justify-content(@justify: flex-start) {
    -webkit-justify-content: @justify;
    -moz-justify-content: @justify;
    -ms-justify-content: @justify;
    justify-content: @justify;
}

// Packing Flex Lines
// - applies to: multi-line flex containers
// flex-start | flex-end | center | space-between | space-around | stretch
.align-content(@align: stretch) {
    // http://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-pack
    -webkit-box-pack: @align; // Old syntax: start | end | center | justify | distribute
    -webkit-align-content: @align;
    -moz-align-content: @align;
    -ms-align-content: @align;
    align-content: @align;
}

// Cross-axis Alignment
// - applies to: flex containers
// flex-start | flex-end | center | baseline | stretch
.align-items(@align: stretch) {
    // start | center | end | baseline | stretch
    -webkit-box-align: @align; // Old syntax
    -webkit-align-items: @align;
    -moz-align-items: @align;
    -ms-align-items: @align;
    align-items: @align;
}

// Display Order
// - applies to: flex items
// <integer>
.flex-order(@order: 0) {
    -webkit-flex-order: @order; // Old syntax
    -webkit-order: @order;
    -moz-order: @order;
    -ms-order: @order;
    order: @order;
}

// Flex grow factor
// - applies to: flex items
// <number>
.flex-grow(@grow: 0) {
    -webkit-flex-grow: @grow;
    -moz-flex-grow: @grow;
    -ms-flex-grow: @grow;
    flex-grow: @grow;
}

// Flex shr
// - applies to: flex itemsink factor
// <number>
.flex-shrink(@shrink: 1) {
    -webkit-flex-shrink: @shrink;
    -moz-flex-shrink: @shrink;
    -ms-flex-shrink: @shrink;
    flex-shrink: @shrink;
}

// Flex basis
// - the initial main size of the flex item
// - applies to: flex itemsnitial main size of the flex item
// <width>
.flex-basis(@width: auto) {
    -webkit-flex-basis: @width;
    -moz-flex-basis: @width;
    -ms-flex-basis: @width;
    flex-basis: @width;
}

// Cross-axis Alignment
// - applies to: flex items
// auto | flex-start | flex-end | center | baseline | stretch
.align-self(@align: auto) {
    -webkit-align-self: @align;
    -moz-align-self: @align;
    -ms-align-self: @align;
    align-self: @align;
}

// =============================================================================
// Caret
// NOTE: If using ::before or ::after, `content: ""` is required
// =============================================================================
// Caret - down
// -----------------------------------------------------------------------------
.caret-down(@size: 6px;
@color: #222) {
    display: inline-block;
    width: 0;
    height: 0;
    vertical-align: middle;
    border-top: @size solid @color;
    border-right: @size solid transparent;
    border-left: @size solid transparent;
    border-bottom: 0 dotted;
    transform: rotate(360deg);
}

// Caret - up
// -----------------------------------------------------------------------------
.caret-up(@size: 6px;
@color: #222) {
    display: inline-block;
    width: 0;
    height: 0;
    vertical-align: middle;
    border-bottom: @size solid @color;
    border-right: @size solid transparent;
    border-left: @size solid transparent;
    border-top: 0 dotted;
    transform: rotate(360deg);
}

// Caret - left
// -----------------------------------------------------------------------------
.caret-left(@size: 6px;
@color: #222) {
    display: inline-block;
    width: 0;
    height: 0;
    vertical-align: middle;
    border-right: @size solid @color;
    border-top: @size solid transparent;
    border-bottom: @size solid transparent;
    border-left: 0 dotted;
    transform: rotate(360deg);
}

// Caret - right
// -----------------------------------------------------------------------------
.caret-right(@size: 6px;
@color: #222) {
    display: inline-block;
    width: 0;
    height: 0;
    vertical-align: middle;
    border-left: @size solid @color;
    border-top: @size solid transparent;
    border-bottom: @size solid transparent;
    border-right: 0 dotted;
    transform: rotate(360deg);
}

// CSS Arrow Mixin
// -----------------------------------------------------------------------------
//
// @param:  45deg (default) - right
//          135deg - down
//          -45deg - up
//          -135deg -left
// ------------------------------------------------------------------------
.arrow(@color: #DDD;
@width: 6px;
@border-width: 2px;
@deg: 45deg) {
    display: inline-block;
    width: @width;
    height: @width;
    border: @color solid;
    border-width: @border-width @border-width 0 0;
    transform: rotate(@deg);
}

// =============================================================================
// COMPONENT MIXINS
// =============================================================================
// Button variants
// =============================================================================
.button-variant(@color;
@background;
@border) {
    color: @color;
    background-color: @background;
    border-color: @border;
    a&:visited {
        color: @color;
    }
    &:hover, &:focus, &:active, &.@{ns}active, // fixes #872
    // dropdown nested in component has `.am-active` state should not active
    .@{ns}dropdown.@{ns}active &.@{ns}dropdown-toggle {
        color: @color;
        border-color: darken(@border, 12%);
    }
    &:hover, &:focus {
        background-color: darken(@background, 7%);
    }
    &:active, &.@{ns}active, .@{ns}dropdown.@{ns}active &.@{ns}dropdown-toggle {
        background-image: none;
        background-color: darken(@background, 14%);
    }
    &.@{ns}disabled, &[disabled], fieldset[disabled] & {
        &, &:hover, &:focus, &:active, &.@{ns}active {
            background-color: @background;
            border-color: @border;
        }
    }
    // for `.@{ns}btn-group`
    .@{ns}btn-group &, .@{ns}btn-group-stacked & {
        border-color: darken(@background, 5%);
    }
    // TODO: add `hollow` button style
}

// Button size
// -----------------------------------------------------------------------------
.button-size(@font-size) {
    font-size: @font-size;
    // line-height: ensure proper height of button next to small input
    // line-height: @line-height;
}

// Form
// =============================================================================
// Form validation states
// -----------------------------------------------------------------------------
.form-field-validation(@text-color: #555;
@border-color: #ccc) {
    // the label and help text color
    .@{ns}form-help, .am-form-label, .am-radio, .am-checkbox, .am-radio-inline, .am-checkbox-inline, label {
        color: @text-color;
    }
    // feedback icon
    [class*="icon-"] {
        color: @text-color;
    }
}

.form-field-validation-filed(@text-color: #555;
@border-color: #ccc) {
    border-color: @border-color !important;
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
    &:focus {
        //background-color: rgba(red(@border-color), green(@border-color), blue(@border-color), .05) !important;
        background-color: @input-focus-bg;
        border-color: darken(@border-color, 10%);
        @shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 5px lighten(@border-color, 20%) !important;
        box-shadow: @shadow !important;
    }
}

// Form element focus state
// -----------------------------------------------------------------------------
.form-field-focus(@color: @input-border-focus) {
    @color-rgba: rgba(red(@color), green(@color), blue(@color), .3);
    &:focus {
        //background-color: rgba(red(@color), green(@color), blue(@color), .05);
        background-color: @input-focus-bg;
        border-color: @color;
        outline: 0;
        box-shadow:~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 5px @{color-rgba}";
    }
}

// Grid
// =============================================================================
.grid-container(@gutter: @grid-gutter, @gutter-md: @grid-gutter-md, @max-width: @grid-max-width) {
    box-sizing: border-box;
    margin-left: auto;
    margin-right: auto;
    padding-left: @gutter;
    padding-right: @gutter;
    width: 100%;
    max-width: @max-width;
    .clearfix;
    @media @medium-up {
        padding-left: @gutter-md;
        padding-right: @gutter-md;
    }
}

// Font ICON mixin
// =============================================================================
// 1. Allow margin
// 2. Prevent inherit font style
// 3. Align vertical to text
// 4. Correct line-height
// 5. Better font rendering in Webkit
.am-icon-font() {
    display: inline-block; // 1
    font: normal normal normal @global-font-size/1 "FontAwesome", sans-serif; // shortening font declaration
    /*font-weight: normal; // 2
  font-style: normal; // 2
  vertical-align: baseline; // 3
  line-height: 1; // 4*/
    font-size: inherit; // can't have font-size inherit on line above, so need to override
    text-rendering: auto; // optimizelegibility throws things off #1094
    -webkit-font-smoothing: antialiased; // 5
    -moz-osx-font-smoothing: grayscale;
    transform: translate(0, 0); // ensures no half-pixel rendering in firefox
}

// angle
// =============================================================================
// TODO: 分隔成小块
.angle-base() {
    &:before, &:after {
        position: absolute;
        display: block;
        content: "";
        width: 0;
        height: 0;
        border: 8px dashed transparent;
        z-index: 1;
    }
}

.angle-up-variant(@border-color: #ddd;
@bg-color: #fff;
@border-width: 8px) {
    &:before, &:after {
        border-bottom-style: solid;
        border-width: 0 @border-width @border-width;
    }
    &:before {
        border-bottom-color: @border-color;
        bottom: 0;
    }
    &:after {
        border-bottom-color: @bg-color;
        bottom: -1px;
    }
}

.angle-down-variant(@border-color: #ddd;
@bg-color: #fff;
@border-width: 8px) {
    bottom: -(@border-width + 1);
    &:before, &:after {
        border-top-style: solid;
        border-width: @border-width @border-width 0;
    }
    &:before {
        border-top-color: @border-color;
        bottom: 0;
    }
    &:after {
        border-top-color: @bg-color;
        bottom: 1px;
    }
}

.angle-left-variant(@border-color: #ddd;
@bg-color: #fff;
@border-width: 8px) {
    left: -(@border-width + 1);
    &:before, &:after {
        border-right-style: solid;
        border-width: @border-width @border-width @border-width 0;
    }
    &:before {
        border-right-color: @border-color;
        left: 0;
    }
    &:after {
        border-right-color: @bg-color;
        left: 1px;
    }
}

.angle-right-variant(@border-color: #ddd;
@bg-color: #fff;
@border-width: 8px) {
    right: 0;
    &:before, &:after {
        border-left-style: solid;
        border-width: @border-width 0 @border-width @border-width;
    }
    &:before {
        border-left-color: @border-color;
        left: 0;
    }
    &:after {
        border-left-color: @bg-color;
        left: -1px;
    }
}
